//
// Created by summerday on 2021/6/6.
//

#include "iostream"
#include "cstdio"

#include "linked_stack.h"

#define SIZE 10
bool bracketCheck(char str[], int length){
    LinkStack s;
    initStack(s);

    for(int i = 0; i < length; i ++){
        if(str[i] == '(' || str[i] == '[' || str[i] == '{')
            push(s, str[i]);// 左括号 入栈
        else{
            if(empty(s)) // 多余右括号
                return false;
            int topElem;
            pop(s, topElem);
            if(str[i] == ')' && topElem != '(') return false;
            if(str[i] == ']' && topElem != '[') return false;
            if(str[i] == '}' && topElem != '{') return false;
        }
    }
    return empty(s); // 多余左括号
}


bool check2(char str[], int len){
    char stk[SIZE];
    int top = 0;

    for(int i = 0; i < len; i ++){
        if(str[i] == '(' || str[i] == '[' || str[i] == '{')
            stk[top ++] = str[i];
        else{
            if(top == 0) // 多余右括号
                return false;
            if(str[i] == ')' && stk[top--] != '(') return false;
            if(str[i] == ']' && stk[top--] != '[') return false;
            if(str[i] == '}' && stk[top--] != '{') return false;
        }
    }
    return top == 0;
}

// 表达式求值

/**
 * 中缀表达式a + b*c + (d * e + f) * g，其转换成后缀表达式则为a b c * + d e * f  + g * +。

转换过程需要用到栈，具体过程如下：

1）如果遇到操作数，我们就直接将其输出。

2）如果遇到操作符，则我们将其放入到栈中，遇到左括号时我们也将其放入栈中。

3）如果遇到一个右括号，则将栈元素弹出，将弹出的操作符输出直到遇到左括号为止。注意，左括号只弹出并不输出。

4）如果遇到任何其他的操作符，如（“+”， “*”，“（”）等，从栈中弹出元素直到遇到发现更低优先级的元素(或者栈为空)为止。弹出完这些元素后，才将遇到的操作符压入到栈中。有一点需要注意，只有在遇到" ) "的情况下我们才弹出" ( "，其他情况我们都不会弹出" ( "。

5）如果我们读到了输入的末尾，则将栈中所有元素依次弹出。
————————————————
版权声明：本文为CSDN博主「石锅拌饭」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
原文链接：https://blog.csdn.net/sgbfblog/article/details/8001651
 我自己实现的伪代码
 void do_alter(string s){
    Stack opStack;
    for(char c : s){
        if(isNum(c)) print(c);
        else if(isOp(c)) {
            if(isLeft(c)){
                while(!opStack.isEmpty() && rank(opStack.getTop()) >= c){
                    print(opStack.pop());
                }
                opStack.push(c);
            }else if(isRight(c)){
                while(!opStack.isEmpty() && opStack.getTop() != '(')
                    print(opStack.pop());
                opStack.pop();
            }

        }

    }
    while(!opStack.isEmpty()) print(opStack.pop());
 }
 */

